package main

import (
	"dump/backup"
	"dump/config"
	"dump/utils"
	"flag"
	"fmt"
	"os"
	"time"
)

func main() {
	helpFlag := flag.Bool("help", false, "显示帮助信息")
	flag.Parse()

	if *helpFlag {
		utils.PrintHelp()
		return
	}
	configPath := flag.String("config", "backup.cnf", "配置文件路径")

	if err := backup.CheckConfig(*configPath); err != nil {
		os.Exit(2)
		return
	}

	cfg, err := config.ParseConfig(*configPath)
	if err != nil {
		fmt.Printf("配置加载失败: %v\n", err)
		return
	}
	// 初始化日志
	if err := utils.InitLogger(cfg.LogDir); err != nil {
		fmt.Printf("日志初始化失败: %v\n", err)
		return
	}
	defer utils.CloseLogger()

	fmt.Println("日志加载成功")
	utils.Log(utils.INFO, "开始MySQL备份程序")

	// 创建锁文件
	lockFile, err := utils.CreateLockFile(cfg.BackupDir)
	if err != nil {
		utils.Log(utils.ERROR, "%s", err.Error())
		return
	}
	defer func() {
		lockFile.Close()
		os.Remove(lockFile.Name())
	}()

	if err := backup.CheckDumpPath(cfg.DumpPath); err != nil {
		utils.Log(utils.ERROR, "%s", err.Error())
		utils.SendNotificationWithConfig(*cfg, "mysqldump检查失败", err.Error(), "error")
		return
	}

	if err := backup.CheckMySQLConnection(cfg); err != nil {
		utils.Log(utils.ERROR, "%s", err.Error())
		utils.SendNotificationWithConfig(*cfg, "MySQL连接检查失败", err.Error(), "error")
		return
	}

	// fmt.Println("检查完成")

	// 执行备份
	startTime := time.Now()
	err = backup.PerformBackup(cfg)
	duration := time.Since(startTime)

	if err != nil {
		utils.Log(utils.ERROR, "备份失败: %v", err)
		utils.SendNotificationWithConfig(*cfg, "MySQL备份失败", err.Error(), "error")
	} else {
		successMsg := fmt.Sprintf("备份成功完成，耗时: %.2f秒", duration.Seconds())
		utils.Log(utils.INFO, "%s", successMsg)
		if cfg.NotifyEnable && cfg.NotifyAll {
			utils.SendNotificationWithConfig(*cfg, "MySQL备份成功", successMsg, "success")
		}
	}

}
